package com.zzyk.main.mapper;

import com.zzyk.main.model.pojo.CommonCount;
import com.zzyk.main.model.pojo.Device;
import com.zzyk.main.model.pojo.DeviceElectricityDay;
import com.zzyk.main.model.pojo.DeviceExtraData;
import com.zzyk.main.model.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Mapper
public interface DeviceMapper {
    /**
     * delete by primary key
     *
     * @param id primaryKey
     * @return deleteCount
     */
    int deleteByPrimaryKey(Integer id);

    /**
     * insert record to table
     *
     * @param record the record
     * @return insert count
     */
    int insert(Device record);

    /**
     * insert record to table selective
     *
     * @param record the record
     * @return insert count
     */
    int insertSelective(Device record);

    /**
     * select by primary key
     *
     * @param id primary key
     * @return object by primary key
     */
    Device selectByPrimaryKey(Integer id);

    /**
     * update record selective
     *
     * @param record the updated record
     * @return update count
     */
    int updateByPrimaryKeySelective(Device record);

    /**
     * update record
     *
     * @param record the updated record
     * @return update count
     */
    int updateByPrimaryKey(Device record);

    /**
     * 模糊查询设备信息
     *
     * @param type       区分生产设备和采集设备
     * @param param      参数
     * @param areaArr
     * @param deviceList
     * @param bind
     * @return
     */
    List<Device> selectAllByType(@Param("type") Integer type, @Param("param") String param, @Param("enterpriseID") Integer enterpriseID, @Param("areaArr") String[] areaArr, @Param("deviceList") Integer[] deviceList, @Param("bind") Integer bind);

    /**
     * 统计全部设备数量
     *
     * @param type  区分生产设备和采集设备
     * @param id    企业ID 为空此条件不起作用
     * @param areas
     * @param group
     * @return
     */
    CommonCount getCount(@Param("type") Integer type, @Param("id") Integer id, @Param("areas") String[] areas, @Param("group") Integer[] group);

    /**
     * 统计各个状态下的设备数量
     *
     * @param type  区分生产设备和采集设备
     * @param id    企业ID 为空此条件不起作用
     * @param areas
     * @param group
     * @return
     */
    List<CommonCount> selectCountGroupByStatusTwo(@Param("type") Integer type, @Param("id") Integer id, @Param("areas") String[] areas, @Param("group") Integer[] group);

    /**
     * 根据设备编号查询设备信息
     *
     * @param sn
     * @param type
     * @return
     */
    Device selectOneBySn(@Param("sn") String sn, @Param("type") Integer type);

    /**
     * 根据ID去查询谁被信息
     *
     * @param id   设备ID
     * @param type 区分生产设备和采集设备
     * @return
     */
    Device selectonebyidAndType(@Param("id") Integer id, @Param("type") Integer type);

    /**
     * 根据ID删除设备信息
     *
     * @param id
     * @return
     */
    void deleteById(@Param("id") Integer id);

    /**
     * 根据采集设备编号查询设备信息
     *
     * @param group
     * @return
     */
    List<Device> selectAllByGroup(@Param("group") Integer group);

    /**
     * 根据设备类型和企业ID查询企业下所有的设备
     *
     * @param type
     * @param enterpise
     * @param param
     * @param deviceList
     * @return
     */
    List<Device> selectAllByTypeAndEnterpise(@Param("type") Integer type, @Param("enterpise") Integer enterpise, @Param("param") String param, @Param("deviceList") Integer[] deviceList);

    /**
     * 根据设备类型和企业ID查询企业下所有的未绑定设备
     *
     * @param type
     * @param enterpise
     * @param param
     * @return
     */
    List<Device> selectAllByTypeAndEnterpiseTwo(@Param("type") Integer type, @Param("enterpise") Integer enterpise, @Param("param") String param);

    /**
     * 根据类型和参数查询设备信息
     *
     * @param type       类型 1为查询生产设备 0为采集设备
     * @param param
     * @param areaArr
     * @param deviceList
     * @return
     */
    List<Device> selectAllByTypeAndLikeParam(@Param("type") Integer type, @Param("param") String param, @Param("areaArr") String[] areaArr, @Param("deviceList") Integer[] deviceList);

    List<DeviceNode> getDeviceByTypeAndEnterprise(@Param("enterprise") String[] enterprise, @Param("param") String param, @Param("deviceList") Integer[] deviceList);

    List<DeviceRealData> selectAllDeviceBasicData(@Param("enterpriseID") Integer enterpriseID, @Param("param") String param, @Param("num") Integer num, @Param("sortParam") String sortParam, @Param("deviceType") Integer deviceType, @Param("deviceList") Integer[] deviceList);

    /**
     * 根据企业ID获取生产设备数量
     *
     * @param enterprise 企业ID
     * @return 企业拥有的生产设备数量
     */
    Integer countProductDeviceWithEnterprise(@Param("enterprise") int enterprise);

    /**
     * 根据企业ID获取设备维保信息
     *
     * @param ids        管辖区域
     * @param expire
     * @param deviceList
     * @return 设备维保信息
     */
    List<MaintenanceView> getDeviceMaintenance(@Param("ids") String[] ids, @Param("expire") Integer expire, @Param("deviceList") Integer[] deviceList);

    /**
     * 查询一个设备数据
     *
     * @param type 类型 1为查询生产设备 0为采集设备
     * @return
     */
    Device selectTopeOne(@Param("type") Integer type);

    /**
     * 根据设备ID查询设备信息
     *
     * @param id
     * @param type
     * @return
     */
    Device selectIdAndType(@Param("id") String id, @Param("type") Integer type);

    /**
     * 获取企业下所有设备用电量
     *
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<DateAndString> selectToDayPower(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取企业下所有设备7天内使用率
     *
     * @param enterprise
     * @param beginDate
     * @param endDate
     * @param deviceList
     * @return
     */
    List<Map<String, Object>> selectUsageRate(@Param("enterprise") Integer enterprise, @Param("beginDate") Date beginDate, @Param("endDate") Date endDate, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取企业下昨天天稼动率
     *
     * @param enterprise
     * @param beginDate
     * @param deviceType
     * @param deviceList
     * @return
     */
    List<KeyValueTwo> selectUsageRateTwo(@Param("enterprise") Integer enterprise, @Param("beginDate") Date beginDate, @Param("endDate") Date endDate, @Param("deviceName") String deviceName, @Param("deviceType") Integer deviceType, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取企业下所有设备实时功率
     *
     * @param enterprise
     * @return
     */
    List<DateAndString> selectEnterprisePower(@Param("enterprise") Integer enterprise);

    /**
     * 获取企业下所有设备的实时数据
     *
     * @param enterprise
     * @param deviceList
     * @return
     */
    List<DeviceExtraData> selectEnterpriseExtraData(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取企业下所有设备的健康指数分析
     *
     * @param enterprise
     * @return
     */
    String selectEnterpriseHealth(@Param("enterprise") Integer enterprise);

    /**
     * 根据权限区域和设备类型获取id最小的生产设备信息
     *
     * @param area       用户的权限区域
     * @param deviceList
     * @return
     */
    Device getFirstDeviceByArea(@Param("area") String[] area, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取企业当日生产时长
     *
     * @param enterprise
     * @param deviceList
     * @return
     */
    String selectToDayProductionTime(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取企业生产时长（用设备分组）
     *
     * @param enterprise
     * @param deviceList
     * @return
     */
    String selectToDayProductionTimeOne(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取企业生产时长数据 本周 上周 本月  上月
     *
     * @param enterprise
     * @param lastWeekBegin
     * @param lastWeekEnd
     * @return
     */
    EnterpriseProductionTime getMoreProductionTime(@Param("enterprise") Integer enterprise, @Param("lastWeekBegin") Date lastWeekBegin, @Param("lastWeekEnd") Date lastWeekEnd);

    /**
     * 获取企业生产时长数据 本周 上周 本月  上月（用设备分组）
     *
     * @param deviceList
     * @param lastWeekBegin
     * @param lastWeekEnd
     * @return
     */
    EnterpriseProductionTime getMoreProductionTimeOne(@Param("deviceList") Integer[] deviceList, @Param("lastWeekBegin") Date lastWeekBegin, @Param("lastWeekEnd") Date lastWeekEnd);

    /**
     * 根据传入的企业ID查询所属企业下所有设备的有功和额定功率
     *
     * @param enterprise
     * @return
     */
    List<KeyValue> selectEnterprisePowerData(@Param("enterprise") Integer enterprise);

    /**
     * 获取今日数据
     *
     * @param enterprise
     * @param deviceList
     * @return
     */
    CommonKeyValue selectToDayStatistics(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取昨日数据
     *
     * @param enterprise
     * @param deviceList
     * @return
     */
    CommonKeyValue selectYesterdayStatistics(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    CommonKeyValue selectthisMonthStatistics(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    CommonKeyValue selectlastMonthStatistics(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    CommonKeyValue selectToDayStatisticsByDeviceId(@Param("id") Integer id);

    CommonKeyValue selectYesterdayStatisticsDeviceId(@Param("id") Integer id);

    CommonKeyValue selectthisMonthStatisticsByDeviceId(@Param("id") Integer id);

    CommonKeyValue selectlastMonthStatisticsByDeviceId(@Param("id") Integer id);

    Device selectOneByGroupAndType(@Param("group") Integer group, @Param("type") Integer type);

    List<Device> selectAllByEnterpise(@Param("enterpise") Integer enterpise);

    Device selectonebyclientIdAndType(@Param("clientId") String clientId, @Param("type") Integer type);

    List<KeyValue> selectDeviceStatusByParam(@Param("enterprise") Integer enterprise, @Param("param") String param, @Param("deviceType") Integer deviceType, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取某个企业下，某个月，的平均设备使用率
     *
     * @param enterprise
     * @param offsetMonth
     * @param deviceList
     * @return
     */
    Double selectLastMonthAvgDeviceUsageRateByEnterpris(@Param("enterprise") Integer enterprise, @Param("offsetMonth") Date offsetMonth, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取某个企业下设备使用率最高的设备和结构
     *
     * @param enterprise
     * @param offsetMonth
     * @param deviceList
     * @return
     */
    CommonKeyValue selectlastMonthMaxDeviceUsageRateByEnterpris(@Param("enterprise") Integer enterprise, @Param("offsetMonth") Date offsetMonth, @Param("deviceList") Integer[] deviceList);

    /**
     * 获取全部采集设备信息
     *
     * @param param
     * @param areaArr
     * @param deviceList
     * @param bind
     * @return
     */
    List<Device> selectCollectionEquipment(@Param("param") String param, @Param("areaArr") String[] areaArr, @Param("deviceList") Integer[] deviceList, @Param("bind") Integer bind, @Param("status") Integer status, @Param("company") Integer company);

    /**
     * 根据传入时间和企业ID查询 某个企业某一周的生产时长
     *
     * @param bDate
     * @param eDate
     * @param enterprise
     * @return
     */
    List<KeyValue> selectProductionTimeByWeekAndEnterprise(@Param("bDate") String bDate, @Param("eDate") String eDate, @Param("enterprise") Integer enterprise);

    /**
     * 根据传入时间和设备id查询 某个企业某一周的生产时长（用设备分组）
     *
     * @param bDate
     * @param eDate
     * @param deviceList
     * @return
     */
    List<KeyValue> selectProductionTimeByWeekAndEnterpriseOne(@Param("bDate") String bDate, @Param("eDate") String eDate, @Param("deviceList") Integer[] deviceList);

    /**
     * 根据设备类型查询 设备信息
     *
     * @param type
     * @return
     */
    List<Device> selectByDeviceType(@Param("type") Integer type);

    /**
     * 根据设备类型查询设备信息
     *
     * @param deviceType
     * @param type
     * @param areaArr
     * @param deviceList
     * @return
     */
    List<Device> selectAllByDeviceType(@Param("deviceType") Integer deviceType, @Param("type") Integer type, @Param("areaArr") String[] areaArr, @Param("deviceList") Integer[] deviceList);

    List<KeyValue> selectTheEnergyYouUseToday(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    /**
     * 修改设备group =null
     *
     * @param id
     * @return
     */
    Integer updateDeviceGroupById(@Param("id") Integer id);

    Device selectProductionBySn(@Param("sn") String sn);

    List<CommonKeyValue> selectAvgProductionTime(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    List<ProductionDetails> selectProductionDetails(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    List<Map<String, Object>> countDeviceType(@Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    List<Map<String, Object>> selectEnergyUsedGroupByDayAndEnterprise(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    List<Map<String, Object>> selectMorePowerConsumptionYear(@Param("year") String year, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    DeviceElectricityDay selectMorePowerConsumptionDay(@Param("day") String day, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    List<Map<String, Object>> selectEnergyUsedByDay(@Param("day") String day, @Param("enterprise") Integer enterprise, @Param("deviceList") Integer[] deviceList);

    List<Device> selectAcquisitionEquipmentById(@Param("company") Integer company, @Param("id") Integer id);

    Device selectcOneBayClientId(@Param("clientId") String clientId);

    List<Device> selectNoTypeDevice(@Param("area") String[] areaArr);

    List<Device> selectAllInDeviceType(@Param("integers") List<Integer> integers, @Param("organization") Integer organization);

    List<Device> selectAllInId(@Param("deviceIds") List<Integer> deviceIds, @Param("param") String param);

    List<Device> selectAllByEnterpiseAndNotType(@Param("organization") Integer organization);

    /**
     * 根据clientId获取生产设备信息
     *
     * @param number
     * @return
     */
    Device selectProductionDeviceByClientId(@Param("number") String number);

    Device selectVwDeviceProduceById(@Param("id") Integer id);

    List<MaintenanceView> selectExtensionMaintenanceInfo(@Param("ids") String[] ids, @Param("expire") Integer expire, @Param("deviceList") Integer[] deviceList);
}